Skip to content

Research iOS: offer a plan's larger sizes on the paywall - #1609

Merged
AnthonyRonning merged 1 commit into
masterfrom
codex-maxplus-maple-ios
Nov 14, 2026
Merged

AnthonyRonning merged 1 commit into
masterfrom
codex-maxplus-maple-ios

Conversation

@AnthonyRonning

@AnthonyRonning AnthonyRonning commented Nov 14, 2026 •

Copy link
Copy Markdown
Contributor

Stacked on #1564, which adds the plan helpers this uses. Review that one first; this PR's diff is the iOS paywall only.

What changes

The iOS paywall sells Pro and Max from two fixed App Store identifiers. The web pricing page (in #1564) already offers any individual plan billing lists that has no card of its own as a larger size of the plan below it. This does the same on iOS.

  • Where the size comes from: billing's product list can now name the App Store product that sells a plan monthly (apple_product_id). A listed plan with such a product and no card of its own becomes a size of the highest plan below it.
  • What the subscriber sees: a size switch on that plan's card, labelled with the App Store's own prices. Picking a size changes the card's title, price, first feature line and button, and the purchase uses that size's product.
  • Current plan: a subscriber on the larger size sees it selected, with the manage button. The plan's own size stays one pick away.

Behavior that does not change

  • Pro and Max keep their fixed identifiers. If the product list cannot be loaded, or billing is older and sends no apple_product_id, the paywall is exactly as before.
  • A size the App Store does not return a valid monthly product for is not offered and is not an error. The existing "some plans are unavailable" message still depends only on Pro and Max.
  • A size is offered only while its plan has an App Store price.
  • Conflict, pending-approval, restore, retry and manage logic is unchanged; a purchase awaiting approval blocks both sizes.

Validation

The repository's commit hook for Research: format check, lint, type check and the full test suite (1,196 tests, 0 failures). New tests cover the size lookup and its refusals, the product hook requesting and validating sizes, and the switch on the card (picking, buying, a subscriber on the larger size, a pending purchase). Test fixtures use an invented plan.

Not run: the paywall on a device or simulator, a StoreKit purchase of a size, or the page against a billing server that lists one.

🤖 Generated with Claude Code


Autofix with [code]smith
Open in [code]smith · Need help on this PR? Tag @codesmith-bot with what you need.

Base automatically changed from codex-maxplus-maple to master November 14, 2026 08:19
The iOS paywall sells two plans from fixed App Store identifiers. Billing
now names the App Store product of each plan it maps, so the paywall can
offer a plan it has no card for as a larger size of the plan below it,
the way the web pricing page does. The size switch is labelled with the
App Store's own prices.

Pro and Max keep their fixed identifiers, so the paywall works when the
product list cannot be loaded, and a size the App Store does not return
is not offered.

Co-Authored-By: Claude <noreply@anthropic.com>
@github-actions

Copy link
Copy Markdown
Contributor

Maple development preview: https://5576e21b.maple-ca8.pages.dev

Commit: 335d48fb93d40a87dc38138df1a687ff891b3f40

Uses development API, billing, flags and PCR configuration. Cloudflare Access applies.

@AnthonyRonning
AnthonyRonning merged commit 8f77ffb into master Nov 14, 2026
22 checks passed
@AnthonyRonning
AnthonyRonning deleted the codex-maxplus-maple-ios branch November 14, 2026 08:25

This branch was successfully deployed

1 active deployment
pages-pr-1609 — 335d48fb Deployed Nov 14, 2026 by github-actions[bot]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant